home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / terminate.c < prev    next >
C/C++ Source or Header  |  1992-11-05  |  1KB  |  59 lines

  1. #include "scheme.h"
  2.  
  3. static WEAK_NODE *first;
  4.  
  5. void Call_Terminators();
  6.  
  7. Init_Terminate () {
  8.     Register_After_GC (Call_Terminators);
  9. }
  10.  
  11. Register_Terminate (obj, func) Object obj; void (*func)(); {
  12.     WEAK_NODE *p;
  13.  
  14.     p = (WEAK_NODE *)Safe_Malloc (sizeof (*p));
  15.     p->object = obj;
  16.     p->terminate = func;
  17.     p->next = first;
  18.     first = p;
  19. }
  20.  
  21. Deregister_Terminate (obj) Object obj; {
  22.     WEAK_NODE *p, **pp;
  23.  
  24.     for (pp = &first; (p = *pp); ) {
  25.     if (EQ(p->object, obj)) {
  26.         *pp = p->next;
  27.         free ((char *)p);
  28.     } else pp = &p->next;
  29.     }
  30. }
  31.  
  32. Terminate_All (type) int type; {
  33.     WEAK_NODE *p, **pp;
  34.  
  35.     for (pp = &first; (p = *pp); ) {
  36.     if (TYPE(p->object) == type) {
  37.         p->terminate(p->object);
  38.         *pp = p->next;
  39.         free ((char *)p);
  40.     } else pp = &p->next;
  41.     }
  42. }
  43.  
  44. void Call_Terminators () {
  45.     WEAK_NODE *p, **pp;
  46.  
  47.     for (pp = &first; (p = *pp); ) {
  48.     if (IS_ALIVE(p->object)) {
  49.         if (WAS_FORWARDED(p->object))
  50.         UPDATE_OBJ(p->object);
  51.         pp = &p->next;
  52.     } else {
  53.         p->terminate(p->object);
  54.         *pp = p->next;
  55.         free ((char *)p);
  56.     }
  57.     }
  58. }
  59.